package com.hsylient.scheduled.controller;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class SpringScheduleController {

    /**
     * 优点：springboot自己的定时任务，一个注解搞定
     * 缺点：在实际的工作中都不是单体项目，微服务项目的话，这样写就有问题了。比如某个action只需要在一台机器上执行一次，多个服务的话会执行多次
     * 解决方案：使用xxl-job
     * 使用 Cron 表达式来定义任务执行时间。Cron 表达式格式为 秒 分 时 日 月 星期 [年]
     */
    // 每5秒执行一次
    @Scheduled(fixedRate = 5000)
    public void taskWithFixedRate() {
        log.info("[测试Spring定时任务] 每5秒执行一次");
    }


    // 上次任务完成后等待5秒再执行
    @Scheduled(fixedDelay = 5000)
    public void taskWithFixedDelay() {
        log.info("任务开始。。。。");
        ThreadUtil.sleep(RandomUtil.randomLong(5000));
        log.info("[测试Spring定时任务] 上次任务执行完后5秒钟再执行");
    }

    // 初始延迟10秒，然后每5秒执行一次
    @Scheduled(initialDelay = 10000, fixedRate = 5000)
    public void taskWithInitialDelay() {
        log.info("[测试Spring定时任务] 延迟10秒后，每5秒种执行一次");
    }

    // 每分钟的0秒时执行一次f
    @Scheduled(cron = "0 0/1 * * * ?")
    public void taskWithCronExpression() {
        log.info("Cron expression task executed");
    }

}
